<?php
//include("mysqlClass.php");
//用指定的键名数组和指定的值数组填充为一个新的数组
//返回的数组长度取决于keys和values数组的最大长度
function array_fill_keys_values($keys,$values){
	$keys=array_values($keys);
	$values=array_values($values);
	$keys_length=count($keys)>count($values)?count($keys):count($values);
	$return_arr=array();			
	if(count($keys)>count($values)){
		for($i=0;$i<$keys_length;$i++){
			if($i>=count($values)){
				$vs=1;
				$return_arr=array_merge($return_arr,array($keys[$i]=>"value".$vs));
				$vs++;
				}
				else{
				$return_arr=array_merge($return_arr,array($keys[$i]=>$values[$i]));						
				}			
		}
	}
	else{
	  for($i=0;$i<$keys_length;$i++){
			if($i>=count($keys)){
				$ks=1;
				$return_arr=array_merge($return_arr,array("key".$ks=>$values[$i]));
				$ks++;
				}
				else{
				$return_arr=array_merge($return_arr,array($keys[$i]=>$values[$i]));						
				}			
		} 	
		
	}
	return $return_arr;
}


//使用指定的符号分别连接数组的键名和键值字符串的数组,k键下存储键名字符串，v键下存储值字符串
//
function array_join($arrName,$keySymbol=",",$valuesSymbol=","){
	$keys=array_keys($arrName);
	$values=array_values($arrName);
	$returnArr=array();
	$returnArr["k"]=implode($keySymbol,$keys);
	$returnArr["v"]=implode($valuesSymbol,$values);
	return $returnArr;
	}
	
//获取CSV文件行数
//$CSVfile,		CSV文件路径
function lengthOfCSV($CSVfile){
	if($file=fopen($CSVfile,"r")){
		$i=0;
		while($tmp=fgets($file)){
			$i++;;
			}
		return $i;	
		}
	else{
	   die("lengthOfCSV($CSVfile):ERR:不能打开CSV文件");	
	}
}

//读取csv到数组
//$filePath,    CSV文件 路径
//$num=0,		获取的数据条数,0表示不限制
//$titilRow=1,  标题行位置,0表示无标题行; 
//$skipRow,		需要跳过的行的位置 ，循环读取时很有用
//$isUseKey,	是否使用标题行做数组key,可选值为1和0，1为使用，0为不使用，为1时必须制定标题行
function CSV2Arr($filePath,$num=0,$titleRow=1,$skipRow=0,$isUseKey=0){
	if($titleRow<1 && $isUseKey==1){die("CSV2Arr():ERR:没有设置标题行，所以无法定义新数组的键名");}	
	if($num<0){return array("");}	
	$skipRow=$titleRow+$skipRow;
	//if($skipRow>$num){die("CSV2Arr():ERR:");}
	$CSV_array=array();	
	$endPos=$num+$skipRow;
	
	if($isUseKey==0){
		if($file=fopen($filePath,"r")){
			$num1=0;
			$skipPreTitleRow=$skipRow;			
			while(!feof($file)){				
				$data=CSVFormatData2Arr($file);	
				$num1++;			
				if($num1>$skipRow){//指针到达标题行+跳过的行后一行位置
					if($num==0){//读跳过行的后所有数据
						$CSV_array[]=$data;
					}
					else{
						if($num1<=$endPos){//取$num行数据后停止
						$CSV_array[]=$data;
						}
						else{
						break;//超过指定数目后退出循环
						}
					}
				}									
			}
			fclose($file);			
			return $CSV_array;		
			}
			else{
				die("CSV2Arr():ERR:不能打开文件或参数错误，请检查传入参数以及文件是否存在以及权限设置");	
			}
		}
		else{
			//$CSV_array[]=array_fill_keys_values($kArr,$data);	
		    if($file=fopen($filePath,"r")){
			$num1=0;
			$skipPreTitleRow=$skipRow;			
			while(!feof($file)){				
				$data=CSVFormatData2Arr($file);	
				$num1++;	
				if($num1==$titleRow){//指针到达标题行位置
				$kArr=$data;				
				}		
				if($num1>$skipRow){//指针到达标题行+需跳过的行后一行位置
					if($num==0){//读取标题行后所有数据
						$CSV_array[]=array_fill_keys_values($kArr,$data);	
					}
					else{
						if($num1<=$endPos){//取$num行数据后停止
						$CSV_array[]=array_fill_keys_values($kArr,$data);	
						}
						else{
						break;//超过指定数目后退出循环
						}
					}
				}									
			}
			fclose($file);			
			return $CSV_array;		
			}
			else{
				die("CSV2Arr():ERR:不能打开文件或参数错误，请检查传入参数以及文件是否存在以及权限设置");	
			}
		}

	
}

//读取csv的指定行到数组
//$filePath,    CSV文件 路径
//$row,			指定行
//$titilRow=1,  标题行位置,0表示无标题行
function getRowFromCSV($filePath,$row,$titleRow=1){
	if($file=fopen($filePath,"r")){
		$num=0;
		$data=array();
		while(!feof($file)){
			$num++;
			if($num<$titleRow+$row){
				//fgetcsv($file);
				CSVFormatData2Arr($file);
				continue;
				}
				else{
				$data=CSVFormatData2Arr($file);;
				break;					
				}
										
		}
	    //array_walk($data,"conv");
		fclose($file);	
		return $data;		
		}
		else{
		echo(" getRowFromCSV():ERR:不能打开文件，请检查文件是否存在以及权限设置");	
			}	
	}
	

//CSV格式数据转为数组
//$r,	CSV格式数据字符串
function CSVFormatData2Arr($r){
	 return explode(",",preg_replace("/\s/","",iconv("GBK","UTF-8",fgets($r))));
	 //return explode(",",preg_replace("/\s/","",fgets($r)));	 
	}





//读取csv到mysql，前提是$table表结构和csv一致
//$filePath,    CSV文件 路径
//$num=0,		获取的数据条数,0表示不限制
//$titilRow=1,  标题行位置;
//$skipRow,		需要跳过的行数 ，循环读取时很有用
//$dbLinkResouce,数据库连接资源,
//$dbname,		数据库名称
//$table,		要存入的表
//$isCoverTableIfExist,存在原表时是否删除原表再进行插入数据。默认不删除原表，直接插入数据。

function insertToMysqlFromCSV($filePath,$num=0,$titleRow=0,$skipRow=0,$dbHost="127.0.0.1",$dbUser="root",$dbPass="123456",$dbname="",$table="",$isCoverTableIfExist=0){
			if($titleRow<0){die("ERR：未指定标题行");}
			if(!$SQLlink=@mysql_connect($dbHost, $dbUser, $dbPass)){
				die( 'MYSQL 连接数据库失败,请确定数据库用户名,密码设置正确<br>');	
				}
			else{
			 mysql_query("set names 'utf8'");
			 if(!@mysql_select_db($dbname,$SQLlink)){
				  die( "insertToMysqlFromCSV():ERR:数据库名称错误！");  
				  }	
			
			$colsArr=array_join(getRowFromCSV($filePath,$titleRow,0),',',"` varchar(100)  CHARACTER SET utf8 COLLATE utf8_general_ci,`");//取得标题行作为列名
			$colsStr="`".$colsArr["v"]."`  varchar(100)";
			if($isCoverTableIfExist==1) {
				$sql_str="CREATE TABLE IF NOT EXISTS `".$table."`(
								`id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT  ,
							".
							$colsStr
							."
								)DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = MyISAM;";		
				
					if(!@mysql_query("DROP TABLE IF EXISTS `".$table."`;",$SQLlink)){
						die( "insertToMysqlFromCSV():ERR:删除表时出错！");
						}
					
				
				if(!@mysql_query($sql_str,$SQLlink)){
					die( "insertToMysqlFromCSV():ERR:执行建表出错！$sql_str");	
					} 
				}	
			}						
			$CSVData=CSV2Arr($filePath,$num,$titleRow,$skipRow,1);
			$colsNameStr="`";			
			if(!$rs=@mysql_query("select COLUMN_NAME from information_schema.columns where table_schema = '".$dbname."' and table_name = '".$table."';")){
				 die( "insertToMysqlFromCSV():ERR:表名称错误！");  
				};
			if(!mysql_fetch_array($rs)){die("指定的表没有字段");}
			while($rsA=mysql_fetch_array($rs)){		
        	 $colsNameStr=$colsNameStr.$rsA[0]."`,`";
			}
			$colsNameStr=substr($colsNameStr,0,strlen($colsNameStr)-2);
			for($i=0;$i<count($CSVData);$i++){
				$sqlArr=array_join($CSVData[$i],"`,`","','");
				$insertSQLStr="insert into `".$table."`(".$colsNameStr.") values('".$sqlArr["v"]."')";
  				if(!@mysql_query($insertSQLStr,$SQLlink)){
				die( "insertToMysqlFromCSV():ERR:插入CSV的第".($titleRow+$i+$skipRow+1)."行（包含标题行）数据出错，请检查！".mysql_error().",SQL语句为：\r\n<br />$insertSQLStr");	
				} 
				
			}
			mysql_close($SQLlink);
}


function viewCSV($filePath,$num=1,$skipRows=0){//仅适用于小文件, $num  为要显示的行数,$skipRows要跳过的行数，如标题行和标题前面的行

		if($file=fopen($filePath,"r")){
		$preHTMLstr='<table cellpadding="0" cellspacing="0" border="1" bordercolor="#006699">';
		$i=0;
		$num1=1;//当前读取行序号
		$num3=$num+$skipRows;//最后行序号
		$num2=0;//行序号
		while(!feof($file)){
			if($num1<=$skipRows){fgets($file,filesize($filePath));$num1++;continue;}
			if($num>0 && $num1<=$num3){
			$dataTmp=fgets($file,filesize($filePath));
			$num2++;
			if($num==1){
				$preHTMLstr=$preHTMLstr."<tr><td>序号</td><td>".str_replace(",","</td><td>",iconv("GBK","UTF-8",$dataTmp))."</td></tr>";
				}
			else{
				$preHTMLstr=$preHTMLstr."<tr><td>".($num2)."</td><td>".str_replace(",","</td><td>",iconv("GBK","UTF-8",$dataTmp))."</td></tr>";
			}
			$num1++;
			}
			else{
				break;
			}
			}
		$preHTMLstr=$preHTMLstr."</table>";		
		fclose($file);	
		return $preHTMLstr;		
		}
		else{
		die("viewCSV():ERR:不能打开文件，请检查文件是否存在以及权限设置");	
			}
	
}

?>
